package Docker

import (
	"context"
	"fmt"
	"io"
	"os"
	"os/exec"
	"github.com/docker/docker/api/types"
	"github.com/docker/docker/client"
	"time"




)

// Docker logs
func Docker_logs() {
	// 创建Docker客户端
	cli, err := client.NewClientWithOpts(client.FromEnv)
	if err != nil {
		panic(err)
	}
	// 检查Docker客户端是否正常运行
	_, err = cli.Ping(context.Background())
	if err != nil {
		fmt.Println(Red, "Docker未运行,请启动后再执行", Reset)
		time.Sleep(2 * time.Second)
		return
	}
	containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
	if err != nil {
		panic(err)
	}
	//判断是否有容器，没有则返回
	if len(containers) == 0 {
		//黄色
		fmt.Println(Yellow, "没有容器,请使用命令行运行容器", Reset)
		time.Sleep(2 * time.Second)
		return
	}
	// 从标准输入中获取要查找的容器名称前缀
	// 打印容器列表
	Docker_list_container(false, false)
	var containerName string
	fmt.Print("请输入要查看日志的容器名字(CTRL+C中断): ")
	fmt.Scanln(&containerName)
	// 获取真正的容器ID

	// 遍历容器列表，查找指定容器
	var targetContainer types.Container
	for _, container := range containers {
		if container.Names[0] == "/"+containerName {
			targetContainer = container
			break
		}
	}
	// 如果没有找到指定容器，则输出提示信息并退出
	if targetContainer.ID == "" {
		fmt.Println(Red, "没有找到指定容器", Reset)
		return
	}
	// 获取容器日志
	logs, err := cli.ContainerLogs(context.Background(), targetContainer.ID, types.ContainerLogsOptions{ShowStdout: true})
	if err != nil {
		panic(err)
	}
	// 将日志拷贝到标准输出
	_, err = io.Copy(os.Stdout, logs)
	if err != nil && err != io.EOF {
		panic(err)
	}
	//按任意键继续
	fmt.Println("按任意键继续")
	fmt.Scanln()
}
// 进入容器
func Docker_exec() {
	// 创建Docker客户端
	cli, err := client.NewClientWithOpts(client.FromEnv)
	if err != nil {
		panic(err)
	}
	// 检查Docker客户端是否正常运行
	_, err = cli.Ping(context.Background())
	if err != nil {
		fmt.Println(Red, "Docker未运行,请启动后再执行", Reset)
		time.Sleep(2 * time.Second)
		return
	}
	containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
	if err != nil {
		panic(err)
	}
	//判断是否有容器，没有则返回
	if len(containers) == 0 {
		//黄色
		fmt.Println(Yellow, "没有容器,请使用命令行运行容器", Reset)
		time.Sleep(2 * time.Second)
		return
	}
	
	// 从标准输入中获取要查找的容器名称前缀
	// 打印容器列表
	Docker_list_container(false, false)
	var containerName string
	fmt.Print("请输入要进入的容器名字(CTRL+C中断): ")
	fmt.Scanln(&containerName)
	//黄色警告
	fmt.Println(Yellow, "进入容器后，输入exit退出,Ctrl+A+D后台运行,注意:Ctrl+C,退出容器后失效请刷新Bash", Reset)
	time.Sleep(2 * time.Second)
	// 获取真正的容器ID
	// 遍历容器列表，查找指定容器
	var targetContainer types.Container
	for _, container := range containers {
		if container.Names[0] == "/"+containerName {
			targetContainer = container
			break
		}
	}
	// 如果没有找到指定容器，则输出提示信息并退出
	if targetContainer.ID == "" {
		fmt.Println(Red, "没有找到指定容器", Reset)
		time.Sleep(2 * time.Second)
		return
	}
	// cmd := exec.Command("docker", "exec", "-it", targetContainer.ID, "bash")
	//使用screen进入容器
	cmd := exec.Command("docker", "exec", "-it", targetContainer.ID, "bash")
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr
	cmd.Stdin = os.Stdin
	
	if err := cmd.Start(); err != nil {
		fmt.Println("Failed to start command:", err)
		time.Sleep(2 * time.Second)
		return
	}

	if err := cmd.Wait(); err != nil {
		fmt.Println("Command failed:", err)
		time.Sleep(2 * time.Second)
		return
	}
	

}


